package com.dxb.test.cache_line;

/**
 * 缓存行的大小通常是64字节，在Java中Long是8个字节，所以可以存储8个Long,
 * 举个例子，你访问一个long的变量的时候，他会把帮助再加载7个，
 * 我们上面说为什么选择数组不选择链表，也就是这个原因，在数组中可以依靠缓冲行得到很快地访问。
 *
 * @author DLS
 * @date 2023/01/10
 */
public class CacheLine {
    //考虑一般缓存行大小是64字节, 一个 long 类型占8字节
    static long[][] arr;

    public static void main(String[] args) {
        arr = new long[1024 * 1024][];
        for (int i = 0; i < 1024 * 1024; i++) {
            arr[i] = new long[8];
            for (int j = 0; j < 8; j++) {
                arr[i][j] = 0L;
            }
        }
        long sum = 0L;
        long marked = System.currentTimeMillis();
        for (int i = 0; i < 1024 * 1024; i += 1) {
            for (int j = 0; j < 8; j++) {
                sum = arr[i][j];
            }
        }
        System.out.println("Loop times:" + (System.currentTimeMillis() - marked) + "ms");

        marked = System.currentTimeMillis();
        for (int i = 0; i < 8; i += 1) {
            for (int j = 0; j < 1024 * 1024; j++) {
                sum = arr[j][i];
            }
        }
        System.out.println("Loop times:" + (System.currentTimeMillis() - marked) + "ms");
    }
}
